<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    // - 理解
    // - 就是一块"地盘", 一个代码段所在的区域
    // let a = 1;// 全局
    // function fn(){
    //     let a = 2;// 局部
    // }
    // fn();

    // - 它是静态的(相对于上下文对象), 在编写代码时就确定了
    // let a = 1;
    // function fn(){
    //     console.log(a);
    // }
    // const obj = {
    //     fn
    // }
    // fn();// 1
    // obj.fn();// 1
    //
    //
    // function run(){
    //     let b = 100;
    //     return function(){
    //         console.log(b);// 100
    //     }
    // }
    // const obj2 = {
    //     my:run()
    // }
    // run()();// 100
    // obj2.my();// 100

    // - 分类
    // - 全局作用域:任何不在函数或是大括号中声明的变量,都是在全局作用域下,全局作用域中声明的变量可以在程序的任意位置访问
    // function fn(){
    //     let c = 4;
    //     console.log(a,b);
    // }
    // let a = 1;
    // var b = 2;
    // fn();
    // console.log(c);// 不可以

    // - 函数作用域:如果一个变量是在函数内部声明的,它就在局部作用域下,这个变量只能在函数内部访问,不能再函数以外去访问
    // function fn() {
    //     let c = 1;
    //     return function () {
    //         console.log(c++);
    //     }
    // }
    // // const fn2 = fn();
    // // fn2();// 1
    // // fn2();// 2
    // // fn2();// 3
    // // fn2();// 4
    //
    // fn()();// 1
    // fn()();// 1
    // fn()();// 1
    // fn()();// 1


    // - 没有块作用域(`ES6`有了):`ES6`引入了`let`和`const`关键字,和var关键字不同,在大括号中使用`let`和`const`声明的变量存在于块级作用域中,在大括号之外不能访问这些变量
    // {
    //     let a =1;
    //     console.log(a);
    // }
    // console.log(a);

    // for(let i=0;i<10;i++){
    //
    // }
    // console.log(i);



    // - 作用
    // - 隔离变量，不同作用域下同名变量不会有冲突
    // (function(window){
    //     var a = 1;
    //     var b = 2;
    //     // window.a = a;
    //     // window.b = b;
    // })(window);
    // console.log(a,b)





</script>
</html>